#include <iostream>
#include <list>
using namespace std;

#define forn(i,n) for(int i=0;i<(n);i++)
#define forall(it,X) for(typeof((X).begin()) it=(X).begin();it!=(X).end();it++)

typedef struct _Datos {
	list<int>* var;
	list<int>* var_neg;
	int c;
	int v;
} Datos;

typedef struct _Resultados {
	int* clausulas;
	int* variables;
	int* max_clausulas;
	int* max_variables;
} Resultados;

bool mayor(int* c1, int* c2, int c){
	int n1 = 0;
	int n2 = 0;
	forn(i,c){
		if(c1[i]==1) n1++;
		if(c2[i]==1) n2++;
	}
	return (n1 > n2);
}

void imprimir(int* clausulas, int* variables, int c, int v){
	/* Cantidad de clausulas satisfechas */

	int n = 0;
	forn(i,c) if(clausulas[i]>0) n++;
	cout << n << endl;

	/* Clausulas satisfechas */

	cout << "C";
	forn(i,c) if(clausulas[i]>0) cout << " " << i+1;
	cout << endl;

	/* Variables verdaderas */

	cout << "V";
	forn(i,v) if(variables[i]>0) cout << " " << i+1;
	cout << endl;
}

void func( Resultados& resultados, const Datos& datos, int iteracion ){
	list<int> cambios;

	resultados.variables[iteracion] = 1;
	forall(it,datos.var[iteracion]) if(resultados.clausulas[*it]==0){
		resultados.clausulas[*it] = 1;
		cambios.push_back(*it);
	}

	if(iteracion < datos.v-1)
		func(resultados,datos,iteracion+1);
	else
		if(mayor(resultados.clausulas,resultados.max_clausulas,datos.c)){
			forn(i,datos.c) resultados.max_clausulas[i] = resultados.clausulas[i];
			forn(i,datos.v) resultados.max_variables[i] = resultados.variables[i];
		}
	forall(it,cambios) resultados.clausulas[*it] = 0;
	cambios.clear();
	resultados.variables[iteracion] = 0;
	forall(it,datos.var_neg[iteracion]){
		if(resultados.clausulas[*it]==0) resultados.clausulas[*it] = 1;
		cambios.push_back(*it);
	}
	if(iteracion < datos.v-1){
		func(resultados,datos,iteracion+1);
	}else{
		if(mayor(resultados.clausulas,resultados.max_clausulas,datos.c)){
			forn(i,datos.c) resultados.max_clausulas[i] = resultados.clausulas[i];
			forn(i,datos.v) resultados.max_variables[i] = resultados.variables[i];
		}
	}
	forall(it,cambios) resultados.clausulas[*it] = 0;
}

int main(){
	int c; int v;
	while( cin >> c && cin >> v && c!=-1 && v!=-1 ){

		Datos datos;
		datos.v = v;
		datos.c = c;
		datos.var = new list<int>[v];
		datos.var_neg = new list<int>[v];

		/* Leo la entrada. Guardo para cada variable,
		 * la lista de clausulas a la que pertenece.
		 * Las variables estan organizadas en un arreglo */

		forn(i,c){
			int j; cin >> j;
			forn(l,j){
				int k; cin >> k;
				if(k > 0){
					k--;						// porque las queremos desde 0 -> v-1
					datos.var[k].push_back(i);
				}else{
					k*=-1; k--;					// porque las queremos desde 0 -> v-1
					datos.var_neg[k].push_back(i);
				}
			}
		}

		/* Algoritmo */

		Resultados resultados;
		resultados.clausulas = new int[c]; forn(i,c) resultados.clausulas[i] = 0;
		resultados.variables = new int[v];
		resultados.max_clausulas = new int[c]; forn(i,c) resultados.max_clausulas[i] = 0;
		resultados.max_variables = new int[v];

		func(resultados,datos,0);

		imprimir(resultados.max_clausulas,resultados.max_variables,c,v);

	}
	return 0;
}
